package main

import "log"

func main() {
	log.Printf("func1 的类型=>%T\n", func1)
	log.Printf("func2 的类型=>%T\n", func2)
	var f func(string, int) int     //类似声明一个变量，golang 中函数也是变量
	f = func2                       //将func2 的地址赋给f
	log.Printf("f =>%v", f)         //打印的是f的地址
	log.Printf("func2 =>%v", func2) //打印的func2 的地址
	f("222", 22)
	num := fbnq(40)
	log.Println(num)

	n := sum_n(100)
	log.Printf("和=%d", n)

	/**
	1、匿名函数只能调用执行一次
	2、如果想多次调用执行，需要赋给一个变量
	*/
	func() {
		log.Println("我是一个匿名函数0")
	}()
	c := func(a, b int) int {
		log.Println("我是一个匿名函数1")
		log.Printf("%d + %d =%d \n", a, b, a+b)
		return a + b
	}
	c(1, 5)
	c(3, 56)

}

//声明一个无参数无返回值函数类型
func func1() {
	log.Println("我是func1")
}

//声明一个有参数 有返回值的类型
func func2(name string, count int) int {
	log.Println("我是func2")
	return 0
}

/**
斐波那契数列-->递归的方式实现
1 2 3 4 5 6 7   8
1 1 2 3 5 8 13 21
规律就是 前两项之和等于第三项
*/
func fbnq(n int) int {
	if n == 1 || n == 2 {
		return 1
	}
	return fbnq(n-1) + fbnq(n-2)
}

/**
前n 个数求和 --> 递归数据
1  2  3  4
1  3  6  10
使用的是递归算法，前n项之和等于n-1 项 之和加上  第n 项数
*/
func sum_n(n int) int {
	if n == 1 {
		return 1
	}
	return sum_n(n-1) + n
}
